/**
 * Copyright © 2015-2025, imos.cc;
 * Author for Asher Xu (asher.xu@aliyun.com).
 */
package cc.imos.communal.kit;

import cc.imos.communal.constant.Const;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * 文件工具类
 * 
 * @version 1.0 2016年11月2日 下午3:38:59 Asher Xu <br />
 * @author Asher Xu
 */
public final class FileKit {

	private static final Logger log = LoggerFactory.getLogger(FileKit.class);

	/**
	 * 文件重命名
	 * 
	 * @param path
	 * @param oldname
	 * @param newname
	 * @version 1.0 2016年10月27日 上午11:42:20 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static final void rename(String path, String oldname, String newname) {
		if (!oldname.equals(newname)) {// 新的文件名和以前文件名不同时,才有必要进行重命名
			File oldfile = new File(path + "/" + oldname);
			File newfile = new File(path + "/" + newname);
			if (!oldfile.exists()) {
				return;// 重命名文件不存在
			} else if (newfile.exists()) {// 若在该目录下已经有一个文件和新文件名相同，则不允许重命名
				throw new IllegalArgumentException(newname + " 已经存在!");
			} else {
				oldfile.renameTo(newfile);
			}
		} else {
			throw new IllegalArgumentException("新文件名和旧文件名相同...");
		}
	}

	/**
	 * 获取文件后缀
	 * 
	 * @param fileName
	 * @return
	 * @version 1.0 2016年10月27日 上午11:41:59 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static String getSuffix(String fileName) {
		if (fileName != null && fileName.contains(".")) {
			return fileName.substring(fileName.lastIndexOf("."));
		}
		return fileName;
	}

	/**
	 * 删除前缀
	 * 
	 * @param src
	 * @param prefix
	 * @return
	 * @version 1.0 2016年10月27日 上午11:43:42 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static String removePrefix(String src, String prefix) {
		if (src != null && src.startsWith(prefix)) {
			return src.substring(prefix.length());
		}
		return src;
	}

	/**
	 * 
	 * @param file
	 * @return
	 * @version 1.0 2016年10月27日 上午11:47:59 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static String readString(File file) {
		ByteArrayOutputStream baos = null;
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);
			baos = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			for (int len = 0; (len = fis.read(buffer)) > 0;) {
				baos.write(buffer, 0, len);
			}
			return new String(baos.toByteArray(), Const.DEFAULT_ENCODING);
		} catch (Exception e) {
			StringBuilder sb = new StringBuilder();
			sb.append("###### MSG:").append(e.getMessage()).append("\n");
			log.error(sb.toString(), e);
		} finally {
			close(fis, baos);
		}
		return null;
	}

	/**
	 * 
	 * @param file
	 * @param string
	 * @version 1.0 2016年10月27日 上午11:48:04 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static void writeString(File file, String string) {
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file, false);
			fos.write(string.getBytes(Const.DEFAULT_ENCODING));
		} catch (Exception e) {
			StringBuilder sb = new StringBuilder();
			sb.append("###### MSG:").append(e.getMessage()).append("\n");
			log.error(sb.toString(), e);
		} finally {
			close(null, fos);
		}
	}

	/**
	 * 
	 * @param is
	 * @param os
	 * @version 1.0 2016年10月27日 上午11:48:08 Asher Xu <br />
	 * @author Asher Xu
	 */
	private static void close(InputStream is, OutputStream os) {
		if (is != null)
			try {
				is.close();
			} catch (IOException e) {
				StringBuilder sb = new StringBuilder();
				sb.append("###### MSG:").append(e.getMessage()).append("\n");
				log.error(sb.toString(), e);
			}
		if (os != null)
			try {
				os.close();
			} catch (IOException e) {
				StringBuilder sb = new StringBuilder();
				sb.append("###### MSG:").append(e.getMessage()).append("\n");
				log.error(sb.toString(), e);
			}
	}

	/**
	 * 
	 * @param zipFilePath
	 * @throws IOException
	 * @version 1.0 2016年10月27日 上午11:48:12 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static void unzip(String zipFilePath) throws IOException {
		String targetPath = zipFilePath.substring(0, zipFilePath.lastIndexOf("."));
		unzip(zipFilePath, targetPath);
	}

	/**
	 * 
	 * @param zipFilePath
	 * @param targetPath
	 * @throws IOException
	 * @version 1.0 2016年10月27日 上午11:48:15 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static void unzip(String zipFilePath, String targetPath) throws IOException {
		ZipFile zipFile = new ZipFile(zipFilePath);
		try {
			Enumeration<?> entryEnum = zipFile.entries();
			if (null != entryEnum) {
				while (entryEnum.hasMoreElements()) {
					OutputStream os = null;
					InputStream is = null;
					try {
						ZipEntry zipEntry = (ZipEntry) entryEnum.nextElement();
						if (!zipEntry.isDirectory()) {
							File targetFile = new File(targetPath + File.separator + zipEntry.getName());
							if (!targetFile.getParentFile().exists()) {
								targetFile.getParentFile().mkdirs();
							}
							os = new BufferedOutputStream(new FileOutputStream(targetFile));
							is = zipFile.getInputStream(zipEntry);
							byte[] buffer = new byte[4096];
							int readLen = 0;
							while ((readLen = is.read(buffer, 0, 4096)) > 0) {
								os.write(buffer, 0, readLen);
							}
						}
					} finally {
						if (is != null)
							is.close();
						if (os != null)
							os.close();
					}
				}
			}
		} finally {
			zipFile.close();
		}
	}
}
